package com.bx.implatform.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.bx.implatform.dto.*;
import com.bx.implatform.entity.Group;
import com.bx.implatform.vo.GroupMemberVO;
import com.bx.implatform.vo.GroupVO;
import jakarta.validation.constraints.NotNull;

import java.util.List;

public interface GroupService extends IService<Group> {

    /**
     * 创建新群聊
     *
     * @param vo 群聊信息
     * @return 群聊信息
     **/
    GroupVO createGroup(GroupVO vo);

    /**
     * 修改群聊信息
     *
     * @param vo 群聊信息
     * @return 群聊信息
     **/
    GroupVO modifyGroup(GroupVO vo);

    /**
     * 删除群聊
     *
     * @param groupId 群聊id
     **/
    void deleteGroup(Long groupId);

    /**
     * 退出群聊
     *
     * @param groupId 群聊id
     */
    void quitGroup(Long groupId);

    /**
     * 将用户踢出群聊
     *
     * @param groupId 群聊id
     * @param userId  用户id
     */
    void kickGroup(Long groupId, String userId);

    /**
     * 将用户移出群聊
     * @param dto dto
     */
    void removeGroupMembers(GroupMemberRemoveDTO dto);

    /**
     * 查询当前用户的所有群聊
     *
     * @return 群聊信息列表
     **/
    List<GroupVO> findGroups();

    /**
     * 邀请好友进群
     *
     * @param dto 群id、好友id列表
     **/
    void invite(GroupInviteDTO dto);

    /**
     * 根据id查找群聊，并进行缓存
     *
     * @param groupId 群聊id
     * @return 群聊实体
     */
    Group getAndCheckById(Long groupId);

    /**
     * 根据id查找群聊
     *
     * @param groupId 群聊id
     * @return 群聊vo
     */
    GroupVO findById(Long groupId);

    /**
     * 查询群成员
     *
     * @param groupId 群聊id
     * @return List<GroupMemberVO>
     **/
    List<GroupMemberVO> findGroupMembers(Long groupId);

    /**
     * 消息静音
     * @param dto
     */
    boolean muteGroupMembers(GroupMemberMuteDTO dto);

    /**
     * 自动入群
     * @param dto
     */
    void automaticGroup(GroupAutomaticDTO dto);

    /**
     * 绑定群聊和会议室关系
     * @param dto
     * @return
     */
    boolean groupRoomAdd(GroupRoomDTO dto);

    /**
     * 根据会议室id查询群聊id
     * @param roomId
     * @return
     */
    GroupRoomDTO findGroupIdByRoomId(String roomId);

    /**
     * 删除群聊和会议室的绑定关系
     *
     * @param roomId
     * @return
     */
    boolean groupRoomDel(String roomId);

    /**
     * 根据群聊id查询会议室id
     *
     * @param groupId
     * @param roomStatus
     * @return
     */
    GroupRoomDTO findRoomIdByGroupId(Long groupId, Integer roomStatus);

    /**
     * 关闭群聊会议室
     *
     * @param groupId
     * @param page
     * @param size
     * @param roomType
     * @return
     */
    List<GroupRoomDTO> closeRoomsByGroupId(@NotNull(message = "群聊id不能为空") Long groupId,
                                           @NotNull(message = "页码不能为空") Long page,
                                           @NotNull(message = "size不能为空") Long size,
                                           @NotNull(message = "会议室类型不能为空") String roomType);
}
